相关疑难解决方法(0)

一个接一个地解决承诺(即按顺序)?

请考虑以下以串行/顺序方式读取文件数组的代码.readFiles返回一个promise,只有在按顺序读取所有文件后才会解析.

var readFile = function(file) {
  ... // Returns a promise.
};

var readFiles = function(files) {
  return new Promise((resolve, reject) => 

    var readSequential = function(index) {
      if (index >= files.length) {
        resolve();
      } else {
        readFile(files[index]).then(function() {
          readSequential(index + 1);
        }).catch(reject);
      }
    };

   readSequential(0); // Start!

  });
};
Run Code Online (Sandbox Code Playgroud)

上面的代码可以工作,但我不喜欢按顺序进行递归递归.是否有一种更简单的方法可以重写此代码,以便我不必使用我的奇怪readSequential功能?

最初我试图使用Promise.all,但这导致所有readFile调用同时发生,这不是我想要的:

var readFiles = function(files) {
  return Promise.all(files.map(function(file) {
    return readFile(file);
  }));
};
Run Code Online (Sandbox Code Playgroud)

javascript promise sequential q serial-processing

238
推荐指数
12
解决办法
16万
查看次数

如何在Javascript中用Q顺序运行promises?

我很难顺序运行promises.

var getDelayedString = function(string) {
    var deferred = Q.defer();

    setTimeout(function() {
        document.write(string+" ");
        deferred.resolve();
    }, 500);

    return deferred.promise;
};

var onceUponATime = function() {
    var strings = ["Once", "upon", "a", "time"];

    var promiseFuncs = [];

    strings.forEach(function(str) {
        promiseFuncs.push(getDelayedString(str));
    });

    //return promiseFuncs.reduce(Q.when, Q());
    return promiseFuncs.reduce(function (soFar, f) {
        return soFar.then(f);
    }, Q());    
};

getDelayedString("Hello")
.then(function() {
    return getDelayedString("world!")
})
.then(function() {
    return onceUponATime();
})
.then(function() {
    return getDelayedString("there was a guy and then he fell.")
})
.then(function() {
    return getDelayedString("The …
Run Code Online (Sandbox Code Playgroud)

javascript promise q

8
推荐指数
1
解决办法
5167
查看次数

难以包装javascript行为并将其保留以供日后使用

我正在使用javascript进行编程并使用Promises,现在正在使用Q.js.我终于明白我在理解我在做什么,但是我遇到了特定行为的困难时期.

我有一种情况,我有相似的相似代码重复几次.它基本上就是这样......

{
   // start
   var deferred = Q.defer();

   // do something {
      deferred.resolve();
   }

   return deferred.promise;
}
Run Code Online (Sandbox Code Playgroud)

好吧,这一切都很好,但每次重复这一切都很烦人,所以我试图将它包装成一些东西.这只是一个例子,它不是整个javascript文件,因为大多数其他部分都不相关.

{
   var list = [];
   queue = function(f) {
      var deferred = Q.defer();
      list.push(f(deferred));
      return deferred.promise;
   }

   {
      queue(function(deferred){
         // do some work
         // we want the deferred here so we can resolve it at the correct time
         deferred.resolve();
      });
   }
}
Run Code Online (Sandbox Code Playgroud)

问题是我不想让它在我排队的那一刻运行.我基本上想要构建列表,然后再运行它.我正在使用reduce函数运行列表Q.js

{
   return list.reduce(function(i, f) {
      return i.then(f);
   }, Q()); …
Run Code Online (Sandbox Code Playgroud)

javascript promise q

5
推荐指数
1
解决办法
79
查看次数

标签 统计

javascript ×3

promise ×3

q ×3

sequential ×1

serial-processing ×1