Функция не выполняется из другой функции - PullRequest
0 голосов
/ 02 июля 2019

Я пишу инструмент, который будет следить за доставкой грузов в места получения.Это основано на UPS API и скоро DHL.Я извлекаю набор результатов из базы данных MS SQL - ссылки на авианакладные и хочу проверить с помощью API UPS, имеют ли они определенный статус: «Этот пакет удерживается на будущую дату доставки./ Доставка будет перенесена. 'Затем я возвращаю объект JSON с датой и временем доставки для последующего хранения обратно в БД.

Я написал в функции: - один для извлечения AWB из БД - один для получения результатов из проблемы UPS

в том, что я не могу их вкладывать - UPS один не вызывается (игнорируется без ошибок) из другого.

import {upstrack} from './ups';
import {get} from './sql';

get(function(result) { 
    result.forEach(function (data) {
        console.log(data.AWB) // it outputs the AWB numbers to the console correctly
        upstrack(data.AWB) // this is not even executed - no error pops in the console
        .then(response => console.log(response))
        .catch(error => console.log(error));
    })
})

upstrack('1Z17704F0470475280') //calling this from the root of file will result with the answer being output to the console
    .then(response => console.log(response))
    .catch(error => console.log(error));

Есть идеи, как вызвать функцию upstrack (awb) для получения результата?

ups.js файл:

var Tracking = require('./lib/tracking');
var tracking = new Tracking('myhash', 'mylogin', 'mypass');

let upstrack = (awb) => {
  return new Promise(
    (resolve, reject) => {
      tracking.setJsonResponse(true);
      tracking.useSandbox(false); 
      tracking.makeRequest({
        customerContext: "Customer Data", trackingNumber : awb
      }, function(data, err) {
        if (err) {
          reject(err) 
        }
        if (data) {
          var results = data.TrackResponse.Shipment[0].Package[0].Activity
          var AWB = data.TrackResponse.Shipment[0].ShipmentIdentificationNumber[0]
          results.forEach(element => {
              if (element.Status[0].StatusType[0].Description[0] == 'This package is being held for a future delivery date. / Delivery will be rescheduled.')
                {
                var response = []
                response.push({
                  awb: AWB,
                  status: element.Status[0].StatusType[0].Description[0],
                  date: element.Date[0].replace(/(\d{4})(\d{2})(\d{2})/g, '$1-$2-$3'),
                  time: element.Time[0].replace(/(\d{2})(\d{2})(\d{2})/g, '$1:$2:$3')
                })
                resolve(response)
              }
          });
        }
      });
    }
  )
}

export { upstrack }

1 Ответ

0 голосов
/ 02 июля 2019

Вам не гарантировано resolve здесь, и вам не гарантировано resolve только один раз с тем же разрешением. Вы должны разрешить в else, когда ваш if(data) равен false-y, и вы не должны resolve в цикле, особенно когда вы все еще потенциально строите массив (что на самом деле не происходит, потому что response область видимости).

Если вы не знакомы с итерационными функциями массива, я настоятельно рекомендую вам изучить их. Они действительно могут помочь очистить ваш код и помочь вам сделать намного проще. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/prototype

var Tracking = require("./lib/tracking");
var tracking = new Tracking("myhash", "mylogin", "mypass");

let upstrack = awb => {
    return new Promise((resolve, reject) => {
        tracking.setJsonResponse(true);
        tracking.useSandbox(false);
        tracking.makeRequest({
                customerContext: "Customer Data",
                trackingNumber: awb
            },
            function(data, err) {
                if (err) {
                    reject(err);
                }
                if (data) {
                    var results = data.TrackResponse.Shipment[0].Package[0].Activity;
                    var AWB = data.TrackResponse.Shipment[0].ShipmentIdentificationNumber[0];
                    resolve(
                        results
                        .filter(
                            element =>
                            element.Status[0].StatusType[0].Description[0] ==
                            "This package is being held for a future delivery date. / Delivery will be rescheduled."
                        )
                        .map(element => ({
                            awb: AWB,
                            status: element.Status[0].StatusType[0].Description[0],
                            date: element.Date[0].replace(
                                /(\d{4})(\d{2})(\d{2})/g,
                                "$1-$2-$3"
                            ),
                            time: element.Time[0].replace(
                                /(\d{2})(\d{2})(\d{2})/g,
                                "$1:$2:$3"
                            )
                        }))
                    );
                } else {
                    resolve([]);
                }
            }
        );
    });
};

export {
    upstrack
};

Добавление журналов до и после:

    console.log(data.AWB) // it outputs the AWB numbers to the console correctly
    upstrack(data.AWB) // this is executed but since the promise never resolves...
    .then(response => console.log(response)) // ...this never logs...
    .catch(error => console.log(error)); // ...and this never logs
    console.log(data.AWB) // it outputs the AWB numbers to the console 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...