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

Loop going out of scope not executing chain of promises

本文关键字:执行 承诺 范围 循环      更新时间:2023-09-26
  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;
    }
  }

我想将最终的 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) {
            // 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);
                }) ;
        });
    }
};