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 时,这也将起作用。
我正在使用汇总为我的页面构建网络包。我有一个工作正常的承诺链,但另一个正在尝试加载未执行的地图。
我已经下了断点,我可以在最后一行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 时,这也将起作用。