我正在玩Node.js中的promises,我正在尝试使用Promise.all。我正在推送三个函数,它们将一个promise返回到一个数组中,然后调用Promise.all但是all的决心从未被击中。在调试器上,它还说Promise.all是“未定义的”。
为什么Promise.all永远不会返回,为什么它会显示为“未定义”?
代码的相关部分:
var updates = [];
updates.push(data.updateItemCondition(characterID, specificItemID_toUse, newCondition));
updates.push(data.updateCharacterLoot(characterID, newValue));
updates.push(data.updateSharedLoot(lootUpdateChange));
Promise.all(updates).then(function (success) {
resolve("Item successfully used");
}, function (error) {
resolve("Failed to use item " + error.toString());
});
这三个函数看起来如下所示,使用调试器我可以看到所有三个结果都被命中(io.writeFile上的所有三个相应文件都在磁盘上更新)
data.updateSharedLoot= function (lootUpdateChange) {
return new Promise(function (resolve, reject) {
//some logic
io.writeFile(...,function(callbackSuccess){
resolve(callbackSuccess);
});
});
}
答案 0 :(得分:1)
这很奇怪,因为我甚至在旧的Node 0.12上定义了Promise.all。在节点0.10上,我没有定义Promise。我不认为有Promise的版本但没有Promise.all。也许你在做:
Promise.all = undefined;
你应该定义的是resolve
函数。这里:
Promise.all(updates).then(function (success) {
resolve("Item successfully used");
}, function (error) {
resolve("Failed to use item " + error.toString());
});
您没有任何resolve
来致电。你不是指console.log吗?
Promise.all(updates).then(function (success) {
console.log("Item successfully used");
}, function (error) {
console.log("Failed to use item " + error.toString());
});
同样在这里:
data.updateSharedLoot= function (lootUpdateChange) {
return new Promise(function (resolve, reject) {
//some logic
io.writeFile(...,function(callbackSuccess){
resolve(callbackSuccess);
});
});
}
回调的第一个参数可能是错误,所以你应该:
data.updateSharedLoot= function (lootUpdateChange) {
return new Promise(function (resolve, reject) {
//some logic
io.writeFile(...,function(error, callbackSuccess) {
if (error) {
reject(error);
} else {
resolve(callbackSuccess);
}
});
});
}
但是如果你还在做承诺的话,我还是会建议使用像fs-promise那样的承诺版本的I / O.返回promise的函数可以简单如下:
var fsp = require('fs-promise');
data.updateSharedLoot = function (lootUpdateChange) {
return fsp.writeFile(...);
};
有关详细信息,请参阅this answer。