Javascript Promise.all-in节点未定义

Javascript Promise.all-in节点未定义,javascript,node.js,promise,Javascript,Node.js,Promise,我正在Node.js中玩弄承诺,并尝试使用Promise.all。我将三个函数推送到一个数组中,返回一个promise,然后调用promise。在调试器上,它还表示Promise.all是“未定义的” 为什么承诺永远不会回来,为什么它会显示为“未定义” 守则的有关部分: var updates = []; updates.push(data.updateItemCondition(characterID, specificItemID_toUse, newCondition)); updates

我正在Node.js中玩弄承诺,并尝试使用Promise.all。我将三个函数推送到一个数组中,返回一个promise,然后调用promise。在调试器上,它还表示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上的所有三个对应文件都在磁盘上更新)


这很奇怪,因为即使在旧节点0.12上,我也定义了Promise.all。在节点0.10上,我没有定义承诺。我不认为有一个版本有承诺但没有承诺。也许你在做:

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,就像你在做承诺一样。返回承诺的函数可以非常简单:

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

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

有关详细信息,请参阅。

对不起,我忘了提及这一切都在另一个承诺范围内。在这两种情况下,我都在Promise.all(…)中的两个函数中设置了断点。然后,它们就不会被命中。感谢您的建议,从错误中吸取教训:)
为什么是Promise.all永远不会返回
,因为
Promise.all是“未定义的”
-您不能从不存在的函数中“返回”-您确定您没有“过载”Promise并使用一些已破坏的承诺实现这是什么“
解决
”您正在调用的函数?我所拥有的只是要求(“承诺”)。我在我的应用程序入口点的最开始处设置了一个断点,并且可以看到这个承诺。all已经是未定义的,所以它看起来不像是后来“重载”的。代码完成也不会自动完成Promise.all。记录在案。。node-v是v4.4.7
var fsp = require('fs-promise');

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