如何实现这个承诺的方法

这个问题在这里已经有了答案:

  • 如何将现有的回调API转换为承诺? 17个答案

  • 在您现在居住的浏览器世界中,不幸的是,您如何创建自己的承诺取决于您使用的承诺库。 这里有几种方法可以创建一个通过承诺返回结果的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找到)

    链接地址: http://www.djcxy.com/p/55521.html

    上一篇: HOW to implement this method with a promise

    下一篇: Angular2: Returning Promise