在settimeout内承诺

时间:2016-01-15 20:24:36

标签: javascript node.js promise delay settimeout

我正在尝试以1秒的延迟相互运行承诺,因为我正在使用的API服务器每秒有1个请求限制。

这是我目前的代码

var delay = 0;
return categories.reduce(function(promise, category) {
  var id = setTimeout(function() {
    promise.then(function() {

      return client.itemSearch({
        searchIndex: configuration.SearchIndex,
        CategoryID: category.id,
        Keywords: currentKeyword

      }).then(function(results) {
        var title = results[0].Title;
        var cat = category.name;
        var price = results[0].Price;

        return db.insertProduct(title, cat, price);
      });
    }).catch(function(err) {
      console.log("error", err);
    });

  }, delay * 1000);

  delay += 1;
}, Promise.resolve());

每次循环时,它会将延迟增加1,这样下一个项目就会以1秒的延迟开始。

所以如果它是第一个项目,它的0 * 1 = 0,那么1 * 1 = 1,那么2 * 1 = 2 ...等等

出于某种原因,它不起作用,没有settimeout它完美地工作。

据我所知,延迟后启动一个承诺不应该有问题,除非它可能与延迟完成后没有正确值的变量有关。如果是这种情况,我该如何解决这个问题,或许可以传递变量?

我感谢我能得到的每一个帮助。

1 个答案:

答案 0 :(得分:1)

使用async.eachSeries,您可以逐个处理这些中的每一个,并在每个请求完成后1秒执行异步回调:

<ImageView
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:contentDescription="Main Image"
   android:padding="1dp"
   android:scaleType="fitXY"
   android:src="@drawable/balloon" />