【问题标题】:angular $q and google.maps.api角度 $q 和 google.maps.api
【发布时间】:2017-10-24 01:42:03
【问题描述】:

我一直在努力理解 $q 是如何工作的几个小时。 我正在尝试使其与 google.maps api 中的函数一起使用,但我绝对无法自己回答,或者我完全不理解 $q。 我希望你能帮助我,或者至少给我一些解释。

这是我想做的一个非常简单的例子:

var geocoder = new google.maps.Geocoder();
let promise1 = geocoder.geocode({address: "someAddress"});
let promise2 = geocoder.geocode({address: "someOtherAddress"});
$q.all([promise1, promise2]).then(data => { 
    console.log(data) 
});

//The ouput I get is : [undefined, undefined] but it's definitely not what I expect :P

我哪里错了?这是来自google api的原始异步方法,效果很好。

var geocoder = new google.maps.Geocoder();
geocoder.geocode({address: "someAddress"}, function(response, status){
    if(status === 'ok')
        //Do what I need with the response
    else
        //Do something else
});

问题是我想对多个请求做某事,而不仅仅是一个。 所以我需要在做某事之前存储所有的响应(并等待它们被存储,因为它是一个异步函数)。 这就是为什么我尝试使用 $q 来实现我的目标。

PS:也许这是一个双线程,因为我看到很多关于 $q 的讨论,但即使经过数小时的研究我也找不到问题......所以请不要告诉我谷歌它。

提前感谢您的帮助!

【问题讨论】:

    标签: javascript angularjs google-maps asynchronous promise


    【解决方案1】:

    .geocode 不返回 Promise,它使用回调(如您所知)并返回 undefined,正如您所发现的那样

    您可以按照以下方式制作“承诺​​”地理编码功能

    const geocodePromise = (geocoder, params) => new Promise((resolve, reject)  => {
        geocoder.geocode(params, function(response, status) {
            if (status == 'ok') resolve(response);
            else reject(status);
        });
    });
    
    var geocoder = new google.maps.Geocoder();
    let promise1 = geocodePromise(geocoder, {address: "someAddress"});
    let promise2 = geocodePromise(geocoder, {address: "someOtherAddress"});
    $q.all([promise1, promise2]).then(data => { 
        console.log(data) 
    });
    

    google.maps.Geocoder.geocodeP = function geocodeP(params) {
        return new Promise((resolve, reject)  => {
            this.geocode(params, function(response, status) {
                if (status == 'ok') resolve(response);
                else reject(status);
            });
        });
    };
    var geocoder = new google.maps.Geocoder();
    let promise1 = geocoder.geocodeP({address: "someAddress"});
    let promise2 = geocoder.geocodeP({address: "someOtherAddress"});
    $q.all([promise1, promise2]).then(data => { 
        console.log(data) 
    });
    

    【讨论】:

    • 非常感谢!!!我尝试了您的第一个提议,并且效果很好。事实上,我认为 $q 正在等待地理编码函数和回调完成,我不明白我必须先在 Promise 中“转换”它们。现在对我来说更清楚了:)
    【解决方案2】:

    你正在使用什么节点模块?谷歌地图API?

    geocoder.geocode({address: "someAddress"});
    

    返回一个承诺或 试试这个

    geocoder.geocode({address: "someAddress"}).then(data => console.log(data));
    

    如果它返回undefined,那么导致问题的是它自己的API。

    如果数据不是undefined,则geocoder.geocode() 部分不会导致问题

    你可以试试这个库Get states of tasks ran by bluebird.all().spread()

    对于您提到的“双线程”,JavaScript 不支持多线程。你可以参考这个链接Why doesn't JavaScript support multithreading?

    【讨论】:

    • 事实上,我并没有真正理解承诺是如何工作的,并且“地理编码”功能必须像 Jaromanda 所说的那样被“承诺”。不过感谢您的帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    • 2016-03-15
    • 2016-09-05
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多