2017-05-23 95 views
0

我有一個需求,我們需要使用promise來編寫節點模塊。所以會有3個不同的承諾。只有當他們三人解決時,結果纔會被髮回。我寫了一些代碼。目前的結果是未定義的。讓我知道我可以添加什麼來解決這個問題。如何使承諾返回結果?

這是節點模塊代碼 -

var exports = module.exports = {}; 

exports.getData = function() { 
    var Q = require('q'); 

    var result = 0; 

    // Promise 1 
    var deferred = Q.defer(); 

    var promise1 = Q.fcall(function() { 
     setTimeout(function(){console.log('hi');deferred.resolve(9);}, 1000); 
     return deferred.promise; 
    }); 


    promise1.then(function(contents) { 
     result = result + contents; 
     console.log(contents); 
    }); 

    // promise 2 

    var deferred2 = Q.defer(); 

    var promise2 = Q.fcall(function() { 
     setTimeout(function(){console.log('hi');deferred2.resolve(10);}, 1000); 
     return deferred2.promise; 
    }); 


    promise2.then(function(contents) { 
     result = result + contents; 
     console.log(contents); 
    }); 

    // promise3 

    var deferred3 = Q.defer(); 

    var promise3 = Q.fcall(function() { 
     setTimeout(function(){console.log('hi');deferred3.resolve(11);}, 1000); 
     return deferred3.promise; 
    }); 


    promise3.then(function(contents) { 
     result = result + contents; 
     console.log(contents); 
    }); 

}; 

這是調用的代碼 -

var x = require('./example5.js'); 

var result = x.getData(); 

console.log(' Result is ' + result); 

所以我需要找出一種方法來扶住節點模塊的執行,直到所有的承諾都解決了。

目前輸出 -

結果是不確定的

P.S我對Node.js的新手所以如果這是非常明顯的事情,請原諒!

我認爲這個問題被標記爲重複。但在另一個問題中,我找不到解決方案將結果返回。它仍然返回承諾。

+0

如果承諾是相互的indepentent,Promise.all應該做的伎倆。否則,研究['await'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await)來處理嵌套地獄,你可能遇到太多時-ables。 – k0pernikus

+0

將等待與q諾庫的工作? – user3276247

+0

我檢查了另一個問題。它沒有提到如何返回最終結果。要求不是要將承諾退回。 – user3276247

回答

2

您可以使用Promise.all()來獲得「一個單一的Promise,它解決了當迭代參數中的所有promise都解決了,或拒絕了第一個拒絕promise的原因」。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

var p1 = Promise.resolve(3); 
var p2 = 1337; 
var p3 = new Promise((resolve, reject) => { 
    setTimeout(resolve, 100, 'foo'); 
}); 

Promise.all([p1, p2, p3]).then(values => { 
    console.log(values); // [3, 1337, "foo"] 
}); 
+0

Promise.all仍然返回一個承諾。我需要返回最終結果。 – user3276247

+0

使用傳遞給'then'的值。 – shabs