2016-12-23 86 views
0

我在Node.js中使用Promise并试图使用Promise.all。我推送了三个函数,它们将一个承诺返回给一个数组,然后调用Promise.all,但所有的决心都不会被触发。在调试器上,它也表示Promise.all是“未定义的”。Promise.all在节点中是未定义的

为什么Promise.all从不返回,为什么它显示为“undefined”?

规范的相关部分:

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

'为什么Promise.all永远不会返回,因为'Promise.all是“undefined” - 你不能从一个不存在的函数“返回” - 你确定你没有“重载”Promise与一些破坏的Promise实现 –

+0

你打的这个“resolve”函数是什么? – Bergi

+0

我所有的都是要求('承诺')。我在应用程序入口点的最开始处放置了一个断点,可以看到Promise.all已经是未定义的,所以它看起来并不像之后“过载”。代码完成也不会自动完成Promise.all。为了记录..节点-v是v4.4.7 – YuriW

回答

0

这很奇怪,因为我有Promise.all甚至在旧的节点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); 
      } 
     }); 
    }); 
} 

但我仍建议使用的我一个承诺版本/ O像fs-promise,如果你正在承诺承诺。您返回承诺的功能可能如此简单:

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

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

有关更多详细信息,请参阅this answer

+0

对不起,我忘了提及这是所有的另一个承诺。无论哪种情况,我确实在Promise.all(...)中的两个函数中都放置了断点,然后它们从未被击中。感谢您的建议,从错误中学习:) – YuriW

相关问题