Javascript Ember JS:对进程的顺序相关异步调用

Javascript Ember JS:对进程的顺序相关异步调用,javascript,jquery,ember.js,underscore.js,Javascript,Jquery,Ember.js,Underscore.js,我在向服务器提交请求时遇到问题。我需要在获取其他属性以处理它们之后发送数据。用户可以是新用户或现有用户(带/不带公司名称) 当我进行调用时,它并没有按顺序进行,最终的对象并没有正确的数据,并且由于异步进程计时而获取随机数据。For循环将提前完成 for (var i = 0; i<_uniqEditUsersList.length; i++){ var _uniqEditUser = _uniqEditUsersList[i]; var newUserid = $("[id

我在向服务器提交请求时遇到问题。我需要在获取其他属性以处理它们之后发送数据。用户可以是新用户或现有用户(带/不带公司名称)

当我进行调用时,它并没有按顺序进行,最终的对象并没有正确的数据,并且由于异步进程计时而获取随机数据。For循环将提前完成

for (var i = 0; i<_uniqEditUsersList.length; i++){
    var _uniqEditUser = _uniqEditUsersList[i];
    var newUserid = $("[id='" + _uniqEditUser + "']")[0].value;
    console.log(_uniqEditUser + ' Data '+ newUserid);
    Service.searchUser(newUserid).then(function (userResult) {
        console.log("userResult: " + _.keys(userResult).length);
        console.log(_uniqEditUser2 + ' Data  '+ newUserid2);
        var currentCartId = self.get('cart').id;
        var userResult = userResult ? userResult : "";
        if (_.keys(userResult).length == 0) {
            CompanyName = "NEW_USER";
            var newData = {oldId: _uniqEditUser, newid: newUserid, CompanyName: CompanyName};
            dataMap[counter] = newData;
            if(counter == _uniqEditUsersList.length){
                self.set('processList', dataMap);
                self.processListFunction();
            }
            counter = counter + 1;
        } else {
            Service.getUsers(partnerListObj).then(function (result) {
                if (result.users.totalResults == "1") {
                    CompanyName = result.company;
                } else {
                    CompanyName = "NO_COMPANY"
                }
                var newData = {oldId: _uniqEditUser, newid: newUserid, CompanyName: CompanyName};
                dataMap[counter] = newData;
                if(counter == _uniqEditUsersList.length){
                    self.set('processList', dataMap);
                    self.processListFunction();
                }
                counter = counter + 1;
            }, function (err) {
                self.showErrorMessage(JSON.parse(err.responseText).message);
            });
        }
    }, function (err) {
        self.showErrorMessage(JSON.parse(err.responseText).message);
    });
}

for(var i=0;i以下内容可能适用于您。当然需要进行一些调整。使用reduce将取决于以前的承诺

arrayOfTasksToResolveInOrder.reduce((promise, task) => {
  return promise.then((result) => {
      if (result.condition) {
        return task.fetch(result));
      } else {
        return task.someOtherFetch(result);
      }
    });
}, Ember.RSVP.Promise.resolve());
这篇文章的作者很好地解释了这种模式