模块模式+承诺使用(返回“未定义”

时间:2016-12-20 05:37:57

标签: javascript design-patterns module

我使用了一个设计模式(模块模式)来创建一个函数,然后调用一个函数,该函数返回一个promise,但它返回“undefined”

为什么?这是我的代码:

// spotcrime -----  finds crime loggings of any given area lat/lon + radius
const Crimes = (function () {

    let data;

    let InitCrimes = function (latitude, longitude, radius) {

        let location = {
            latitude: latitude,
            longitude: longitude
        }

        spotcrime.getCrimes(location, radius, (err, crimeData) => {
            if (err) console.log(err);
            data += crimeData;
        });

        return new Promise ((resolve,reject) => {
            if (data !== undefined || data !== null) {
                resolve(data);
            } else {
                reject(err);
            }
        });
    }

    return {
        el_monte: function (latitude, longitude, radius) {
            InitCrimes(latitude, longitude, radius)
                .then(function(crimeData) {
                console.log(crimeData);
            }).catch(function(error) { return error; });
        }
    }

}());
// 34.052901, -118.019821       // el monte
Crimes.el_monte(34.052901, -118.019821, 0.5);

1 个答案:

答案 0 :(得分:0)

那是因为您忘记了return中的el_monte个关键字,并且因为InitCrimes函数中的范围完全搞砸了(在调用之前,您还没有等待异步回调) resolve)。

您的代码应如下所示:

const Crimes = (function () {
    function initCrimes(latitude, longitude, radius) {
        return new Promise((resolve,reject) => {
            spotcrime.getCrimes({latitude, longitude}, radius, (err, crimeData) => {
                if (err) {
                    reject(err);
                } else {
                    resolve(crimeData);
                }
            });
        });
    }

    return {
        el_monte(latitude, longitude, radius) {
            return initCrimes(latitude, longitude, radius).then(data => {
                console.log(data);
                return data;
            });
        }
    }
}());

Crimes.el_monte(34.052901, -118.019821, 0.5).then(data => {
    // do something with the data;
}).catch(error => { 
   console.error(error);
});