为了账号安全,请及时绑定邮箱和手机立即绑定

在承诺中设置超时

在承诺中设置超时

侃侃尔雅 2022-01-07 10:59:14
我想为一个承诺设置一个超时时间。错误信息 :Status is OVER_QUERY_LIMIT. You have exceeded your rate-limit for this API.所以,要每秒执行一次 API,我需要在 Promise 中设置一个超时时间。但是在我下面的代码中它不起作用......我的代码:CoordinateModel.findAll().then(function(findedCoordinates) {  var promises = [];  promises = findedCoordinates.map(function(coordinate) {    return new Promise(function() {      setTimeout(function() {        return geocoder.geocode(coordinate.address + ' ' + coordinate.postcode + ' ' + coordinate.city + ' ' + coordinate.complementaryAddress).then(function(res) {          return coordinate.update({            lng: res[0].longitude,            lat: res[0].latitude          }).then(function() {            console.log(coordinate.name + ' : ' + res[0].longitude + ',' + res[0].latitude);            return Promise.resolve();          });        }).catch(function(err) {          console.log(err);          return Promise.reject();        });      }, 1000);    });  });  Promise.all(promises).then(function() {    console.log('------ END ------');  });});
查看完整描述

2 回答

?
萧十郎

TA贡献1815条经验 获得超13个赞

我在 .map 函数中使用索引,并适当地解决/拒绝承诺。使用您的索引setTimeout


promises = findedCoordinates.map(function(coordinate, index) {

    return new Promise(function(resolve, reject) {

      setTimeout(function() {

        return geocoder.geocode(coordinate.address + ' ' + coordinate.postcode + ' ' + coordinate.city + ' ' + coordinate.complementaryAddress).then(function(res) {

          return coordinate.update({

            lng: res[0].longitude,

            lat: res[0].latitude

          }).then(function() {

            console.log(coordinate.name + ' : ' + res[0].longitude + ',' + res[0].latitude);

            resolve();

          });

        }).catch(function(err) {

          console.log(err);

          reject(err);

        });

      }, 1000 * index);

    });

  });


查看完整回答
反对 回复 2022-01-07
?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

看起来逻辑是错误

的 settimeout 代码的作用它

会同时调用所有请求,除了它会

在一秒后调用 你可以增加 setTimeout 每个实例,就像第一个实例需要 0 秒,第二个例如,它将等待 1 秒,对于该实例,它将等待 2 秒,....通过1000 * i在第 20 行更改


CoordinateModel.findAll().then(function (findedCoordinates) {


    var promises = [];


    promises = findedCoordinates.map(function (coordinate) {

        return new Promise(function () {

            setTimeout(function () {

                return geocoder.geocode(coordinate.address + ' ' + coordinate.postcode + ' ' + coordinate.city + ' ' + coordinate.complementaryAddress).then(function (res) {

                    return coordinate.update({

                        lng: res[0].longitude,

                        lat: res[0].latitude

                    }).then(function () {

                        console.log(coordinate.name + ' : ' + res[0].longitude + ',' + res[0].latitude);

                        return Promise.resolve();

                    });

                }).catch(function (err) {

                    console.log(err);

                    return Promise.reject();

                });

            }, 1000 * i);

        });

    });


    Promise.all(promises).then(function () {

        console.log('------ END ------');

    });


});


查看完整回答
反对 回复 2022-01-07
  • 2 回答
  • 0 关注
  • 130 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信