Promise 链不解析;正确的修复方法是什么?

Promise chain does not resolve; what is the correct way to fix?

我正在使用汇总为我的页面构建网络包。我有一个工作正常的承诺链,但另一个正在尝试加载未执行的地图。

我已经下了断点,我可以在最后一行p().then((m)=>console.log)Q.spread(...)看到断点,但是其他承诺的方法没有执行。

我怎么没能强制解决 promise?

这是我的代码:

'use strict';

import Q from 'q';
import GoogleMapsApiLoader from 'google-maps-api-loader';

var getPositionIP = function() {
    return new Q( (res,rej) => {
        let oReq = new XMLHttpRequest();
        oReq.onload = function (e) {
            let loc = { coords: e };
            res(loc);
        }
        oReq.open("GET","https://json.geoiplookup.io/");
        oReq.responseType = "json";
        oreq.send();
    });
};

var getPositionGPS = function(options) {
    return new Q( function(resolve, reject) {
        if( navigator.geolocation ) {
            navigator.geolocation.getCurrentPosition(resolve,reject,options);
        } else {
            reject();
        }
    });
};

let mapEngine = GoogleMapsApiLoader({
    libraries: [],
    apiKey: '<<google maps key>>'
});

let positionEngine = function() {
    return getPositionGPS({})
        .catch(() => getPositionIP());
};

let p = function() { 
    return Q.spread(positionEngine, mapEngine).then((pos,map) => {
        var mapcontainer = document.getElementById("map");
        return new map.Map(mapcontainer, {
            center: {lat: pos.coords.latitude, lng: pos.coords.longitude},
            zoom: 8
        }); 
    });
};

p().then((m)=>console.log);

那不是 Q.spread 的工作方式。承诺仍然只解析为单个值,spread 是关于影响回调的调用方式。根据文档,您必须编写

return Q.spread([positionEngine, mapEngine], (pos, map) => {

return Q.all([positionEngine, mapEngine]).spread((pos, map) => {

现代方法是使用参数解构语法:

return Q.all([positionEngine, mapEngine]).then(([pos, map]) => {

当您迁移到 ES6 promise 时,这也将起作用。