【发布时间】:2014-10-25 01:11:15
【问题描述】:
我有一个在线教程中的示例,我想知道如何将每个 then 转换为异步调用?
Edit-基本上我希望承诺以异步方式进行每个调用,或者它如何在那里工作。我是 Promise 的新手,一个 Promise 意味着单个异步调用,或者一个 Promise 可以有多个异步调用,然后在最后回调,
如果我有以下三个函数调用,我如何将它们链接为异步,现在它们都按顺序立即触发?
编辑 2 - 在 Joel 的支持下根据学习改进了我的问题,我现在有一个小提琴 http://jsfiddle.net/smartdev101/eLxxpjp3/
var q = require('q');
var defer = q.defer();
defer.promise
.then(function(weapon){
setTimeout(function(){console.log('wait')}, 2000);
console.log("You can have my " + weapon);
return "bow";
})
.then(function(weapon){
console.log("and my " + weapon);
return "axe";
})
.then(function(weapon){
console.log("and my " + weapon);
});
defer.resolve("sword");
【问题讨论】:
-
您必须更具体地说明何时尝试完成。试着用文字来准确地解释你想要什么时候运行各种事情。我希望你意识到
setTimeout()只是在未来的某个时间安排一个回调——它不会延迟下一行代码的运行。 -
编辑了我的问题...
-
在 Javascript 中,您不能只将函数调用转换为异步。给定的操作要么是同步的,要么是异步的。除了
setTimeout(),您的所有操作都是同步的。如果要使同步操作以异步方式运行,可以将其隐藏在setTimeout()后面,但您必须为每个操作添加一个 setTimeout()。这真的是你想做的吗?如果是这样,您希望每次操作延迟多少? -
Promise 不会产生异步代码,它们用于处理现有的异步调用(例如 IO)。您必须记住 javascript 是单线程的,因此您的代码将一次性执行,即使使用 Promise 也是如此。如果你想在调用之间引入任意延迟,你可以在每个 Promise 链中调用一个 setTimeout。
-
上面的代码可能不是正确的例子,而且我对 Promise 很陌生,但我希望按顺序异步调用一些异步过程,比如说调用服务(异步),获取数据,解析结果,然后插入数据库(再次异步),然后通过最终回调通知,promise 可以做到吗?如果那么在上述情况下如何将一个异步调用的结果提供给下一个
标签: javascript node.js angular-promise