【发布时间】:2014-01-16 20:32:03
【问题描述】:
我一直在尝试围绕异步编程和 Promise 的使用。为了帮助理解它们,我编写了一些简单的嵌套代码,但遇到了障碍。
这是代码:http://pastebin.com/hBtk9vER 确保在库时安装(npm install)
var when = require('when');
function promise() {
console.log("Promise");
promiseRead().then(function(string) {
console.log("Inner promise");
console.log(string);
});
}
function promiseRead() {
console.log("PromiseRead");
return baz().then(function() {
console.log("Inner Read");
var deferred = when.defer();
setTimeout(function() {
deferred.resolve("Hello World");
}, 5000);
});
}
function baz() {
console.log("BAZ");
return when(true);
}
promise();
我的问题是 console.log(string) 是未定义的,当我期望它在 promiseRead() 解决后是 "Hello World" 时。有趣的是,当我删除超时时,它按预期工作。谁能帮忙解释一下,为什么promise 函数在promiseRead() 超时之前执行它的代码。
非常感谢
【问题讨论】:
-
我没有时间给出完整的答案,但是在您的
Inner Read中您不会返回任何东西(没有承诺),所以您在这个地方的var deferred = when.defer();是没用的。 -
补充一点,我知道你正在试验,但如果你不以结构化的方式使用它们,承诺并没有多大帮助。承诺点(IMO)是线性组织异步代码。您可以通过添加拒绝和传递延迟来使这更加复杂,但我希望您现在能明白为什么保持基于 Promise 的代码干净很重要。
标签: javascript node.js when-js