【发布时间】:2015-10-03 23:12:46
【问题描述】:
我试图在这里重用从 promise 返回的数据。但是,问题是,在第一次调用checkPromise 函数之后,它立即调用了第二个函数,并且第一个函数的承诺没有实现,所以它永远不会返回任何数据,因此它永远不会进入 if 子句。如何重用 Promise?
var Promise = require('bluebird');
var request = Promise.promisify(require("request"));
var url = 'http://www.google.com';
var obj = new Object;
function apiCall(url) {
return new Promise(function (resolve, reject) {
request(url).spread(function(response, body) {
return resolve(body);
}).catch(function(err) {
console.error(err);
return reject(err);
});
});
}
function checkPromise(url) {
if(obj.hasOwnProperty(url)) {
var rp = obj[url];
//do something
}
else {
apiCall(url).then(function(result) {
obj[url] = result;
//do something
});
}
}
checkPromise(url);
checkPromise(url);
【问题讨论】:
-
为什么不将结果存储在闭包中?
-
承诺不能被“重用”。它成功(一次),或者失败(一次),或者都没有完成。这实际上非常好。使用辅助机制来保存数据。在任何情况下,promise 看起来都是非异步使用的(即,promise 在第二次调用时not 尚未完成),这违背了promise 的基本性质。 (将函数设置为“可能是异步的”,因为它releases Zalgo 通常也很糟糕)。
标签: javascript node.js promise bluebird