尽可能快地从API函数中的Promise返回而不进行进一步处理

时间:2018-04-25 09:56:31

标签: javascript asynchronous promise timeout

我认为我有了承诺的想法,因为它的名字说出来,我们可以或不可能得到回报。要访问已解析的值,我们需要在promise上调用。这是我的捕获。

我不想对结果做任何事情,我只想返回值,因为它是我正在开发的API函数。

我有两个这样的承诺:

var willWeGetConsumptions = new Promise(function(resolve, reject) {
var willWeGetPrices = new Promise(function(resolve, reject) {

和另一个消费者承诺:

var finalPromise = Promise.all([willWeGetConsumptions, willWeGetPrices]).then(function(values) {

我的想法是:

  1. 完成后从var finalPromise = Promise.all返回,(调用解析时),虽然我不能。
  2. 设置超时功能(我认为这是可能的,但我不知道如何)。它应该等待已解决的值并直接返回。它应该与声明的promises处于相同的范围级别,而不是在其中一个范围内定义。
  3. 所有其他解决方案都指的是登录finalPromise.then(function(value) { console.log(value)});

    我认为现在很清楚我想要一个返回值,而不需要进一步处理它。

    上次修改 对于那些不理解的人。 显然,我不想用户(API的调用者)来处理Promise对象(即使我总是确保它已经解决)。

    为什么上次编辑?因为我现在意识到这是一个更广泛的问题,就像复制一样。这是真的,问题是如何从异步函数返回。

2 个答案:

答案 0 :(得分:0)

我认为你误解了Promises的概念。

  

From Promise.all mozilla Promise.all(iterable)方法返回一个Promise ,当可迭代参数中所有的promise都已解析或者iterable参数包含时,它会解析没有承诺。它拒绝承认拒绝的第一个承诺。

        var promise1 = Promise.resolve(3);
        var promise2 = 42;
        var promise3 = new Promise(function(resolve, reject) {
          setTimeout(resolve, 100, 'foo');
        });

  function returningAPromiseForLater (){
       return Promise.all([promise1, promise2, 
    promise3]).then(function(values) {
          console.log(values);
        // Update not just logging.
         whateverFunctionYouCall ( values );
        });
        // expected output: Array [3, 42, "foo"]


   }

 **INVOKING AN EXTERNAL FUNCTION** 

   function whateverFunctionYouCall ( array ) {
        array.forEach(function(singleValue) {
            // send data to DB
           // create a File
            }
        }


**UPDATE 2: Getting the response later**

receiveThePromise = returningAPromiseForLater.then (function(valuesHEREasRESPONSE){
// do whatever with valuesHEREasRESPONSE variable.

});

答案 1 :(得分:0)

Promise.all()是从承诺中重新承诺多个承诺的正确方法。您甚至可以在混音中添加一些同步值。



asyncFun = data => new Promise((v,x) => setTimeout(v, Math.random()*1000, data))

Promise.resolve(Promise.all([asyncFun(1), asyncFun(2), 3]))
       .then(([v1,v2,v3]) => console.log(v1 ,v2 ,v3));