Promise.all在Node中是未定义的

我正在玩Node.js中的承诺,并试图使用Promise.all。 我推送了三个函数,它们将一个承诺返回给一个数组,然后调用Promise.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);
        });
    });
}

这很奇怪,因为我有Promise.all,即使在旧版本的Node 0.12上也是如此。 在节点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);
            }
        });
    });
}

但是,我仍然建议使用承诺的I / O版本,如fs-promise,如果你承诺承诺。 返回承诺的函数可能如下所示:

var fsp = require('fs-promise');

data.updateSharedLoot = function (lootUpdateChange) {
    return fsp.writeFile(...);
};

看到这个答案更多细节。

链接地址: http://www.djcxy.com/p/55365.html

上一篇: Promise.all in Node is undefined

下一篇: Promise.all in JavaScript: How to get resolve value for all promises?