如何实现这个承诺的方法
这个问题在这里已经有了答案:
在您现在居住的浏览器世界中,不幸的是,您如何创建自己的承诺取决于您使用的承诺库。 这里有几种方法可以创建一个通过承诺返回结果的geocode(address)
函数:
// jQuery promises
function geocode(address) {
var geocoder = new google.maps.Geocoder();
var def = $.Deferred();
geocoder.geocode({ 'address': value }, function (results, status) { // called asynchronously
if (status == google.maps.GeocoderStatus.OK) {
def.resolve(results);
} else {
def.reject(status);
}
});
return def.promise();
}
// ES6 style (supported by many polyfills, promise libraries and some browsers natively)
// my favorite library is Bluebird which this would work with
function geocode(address) {
var geocoder = new google.maps.Geocoder();
return new Promise(function(resolve, reject) {
geocoder.geocode({ 'address': value }, function (results, status) { // called asynchronously
if (status == google.maps.GeocoderStatus.OK) {
resolve(results);
} else {
reject(status);
}
});
});
}
两者都可以像这样使用,这很好,很简单:
geocode(address).then(function(result) {
// code here that can use the result
}, function(errStatus) {
// code here to handle an error
});
注意:您不能像这样进行异步操作并将其设置为同步操作。 你不能用Javascript做到这一点。 因此,您必须学习如何使用异步操作进行编程,并且承诺是实现这一目的的一种便捷方式。
其他参考:
将Google地图geocoder.geocode封装在Promise中
Google APIs JavaScript客户端库中的承诺
如何将现有的回调API转换为承诺?
可以像下面那样“包装”地理编码异步调用 - 假设回调本身的返回值是不相关的。
请注意,这不能用于使异步调用同步; 但它确实“包装”了异步回调以使用承诺。
function geocodeWithPromise(data) {
// Different frameworks provided different methods of creating and
// using their promise implementation. Eg in jQuery the following would be:
// promise = $.Deferred();
var promise = makePromise();
geocoder.geocode(data, function (results, status) {
if (status == google.maps.GeocoderStatus.OK) {
promise.resolve(results, status);
} else {
promise.reject(status);
}
});
return promise;
}
// The call is "synchronous" and a promise is returned immediately -
// but done/fail are called later as they are [themselves callbacks and]
// part of the asynchronous promise.
geocodeWithPromise({ 'address': value })
.done(function () { .. })
.fail(function () { .. });
教程JavaScript承诺:在那里和之后再详细解释承诺,并涵盖ES6风格的承诺。
(正如jfriend不断指出,上面的代码使用done/fail
所不需要-因为它们可以与来实现then
- ,并且仅在某些实施方式中承诺如jQuery找到)