Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 循环超出范围,不执行承诺链_Javascript_Backbone.js_Promise - Fatal编程技术网

Javascript 循环超出范围,不执行承诺链

Javascript 循环超出范围,不执行承诺链,javascript,backbone.js,promise,Javascript,Backbone.js,Promise,我想将最终的json返回到我的UI。但是,循环的控制在我的承诺执行之前返回。在asyc函数或调用异步过程的函数中,您必须使用返回承诺或使用回调来捕获错误和数据 searchOrder.callApiBasedOnSearchBy = function(searchBy,responseObj) { var recordsFinalObj = { recordsArray: [], isOrderList: false }; var finalJ

我想将最终的json返回到我的UI。但是,循环的控制在我的承诺执行之前返回。

在asyc函数或调用异步过程的函数中,您必须使用返回承诺或使用回调来捕获错误和数据

  searchOrder.callApiBasedOnSearchBy = function(searchBy,responseObj) {
    var recordsFinalObj = {
      recordsArray: [],
      isOrderList: false
    };
    var finalJson = {};
    var self = this;
    var mapSearchByToApi = {
      'INVOICE_NUMBER': function(responseObj) {
      },
      'ORDER_NUMBER': function(responseObj) {
        self.orderDetailsModel.set("id",responseObj.id);
        self.orderDetailsModel.fetch({}).then(function(orderDetailsResponse) {
          var orderDetails = orderDetailsResponse.records[0];
          if(typeof orderDetails.packet_ids !== 'undefined') {
            var packet_id = orderDetails.packet_ids[0];
            self.packetDetailsModel.set("id",packet_id);
            self.packetDetailsModel.fetch({}).then(function(packetDetailsResponse) {
              console.log(packetDetailsResponse);
              finalJson = packetDetailsResponse.records[0];
              finalJson.order_items = orderDetails.order_items;
              console.log(finalJson);
              return finalJson;
            }, function(error) {
              console.log("Error in Order Item:"+error);
            });

          }
        }, function(error) {
          console.log("Error in Order:"+error);
        })
      },
      'AWB_NUMBER': function(responseObj) {

      },
      'CHANNEL_ORDER_ID': function(responseObj) {

      }
    }

    if(mapSearchByToApi[searchBy]) {
      finalJson = mapSearchByToApi[searchBy](responseObj);
      recordsFinalObj.recordsObj = finalJson;
      return recordsFinalObj;
    }
  }

承诺是一个返回值(对未来结果的承诺),而不是一个函数,并且不会“执行”。因此,你应该归还它们
mapSearchByToApi。订单号
立即返回
undefined
。还有,循环在哪里?如果你写一个简单的函数,做一些异步的事情,然后尝试从中返回一些东西,看看会发生什么,然后首先处理这种情况,那会更好,而不是写一堆不起作用的代码,然后在stackoverflow上发布它,说它不起作用……我一定错过了什么,但是,代码中的循环在哪里呢?如果您正在执行异步操作,则始终需要
返回函数的承诺(特别是
然后
回调函数)。
searchOrder.callApiBasedOnSearchBy = function(searchBy,responseObj) {
    var recordsFinalObj = {
        recordsArray: [],
        isOrderList: false
    };
    var finalJson = {};
    var self = this;
    var mapSearchByToApi = {
        'INVOICE_NUMBER': function(responseObj) {
        },
        'ORDER_NUMBER': function(responseObj) {
            // Return a promise instead of trying to return data itself
            return new Promise(function(resolve, reject) { self.orderDetailsModel.set("id",responseObj.id);
                self.orderDetailsModel.fetch({}).then(function(orderDetailsResponse) {
                    var orderDetails = orderDetailsResponse.records[0];
                    if(typeof orderDetails.packet_ids !== 'undefined') {
                        var packet_id = orderDetails.packet_ids[0];
                        self.packetDetailsModel.set("id",packet_id);
                        self.packetDetailsModel.fetch({}).then(function(packetDetailsResponse) {
                            console.log(packetDetailsResponse);
                            finalJson = packetDetailsResponse.records[0];
                            finalJson.order_items = orderDetails.order_items;
                            console.log(finalJson);
                            return resolve(finalJson); // resolve ur data
                        }, function(error) {
                            console.log("Error in Order Item:"+error);
                            reject(error);
                        });
                    }
                }, function(error) {
                    console.log("Error in Order:"+error);
                });
            });

        },
        'AWB_NUMBER': function(responseObj) {

        },
        'CHANNEL_ORDER_ID': function(responseObj) {

        }
    };

    if(mapSearchByToApi[searchBy]) {
        // Have to return a promise
        return new Promise(function(resolve, reject) {
            mapSearchByToApi[searchBy](responseObj)
                .then(function(finalJson) {
                    recordsFinalObj.recordsObj = finalJson;
                    resolve(recordsFinalObj);
                })
                .catch(function(err){
                    reject(err);
                }) ;
        });

    }
};