簡體   English   中英

內部函數args不可見返回new Promise(function(resolve,reject)

[英]function args not visible inside return new Promise(function(resolve, reject)

在返回的promise塊中,傳遞給被承諾的函數的參數et和instance不可見( 視為null )。 注意:

rp = require('request-promise');
Promise = require('bluebird');

..和我自己的一些模塊(例如urlLib)在頂部。 rp庫是承諾的請求庫...如果我在return語句中顯式設置et和instance變量,則它可以工作。 (請參見帶注釋的et和實例聲明)。

module.exports.getEntityInstance = function (et, instance) {

return new Promise(function(resolve, reject) {

    // explicit setting, to test, works fine.
    // var et = "device", instance = "33";

    if ((!et) || (!instance)) {
        // ****** FAILING HERE *******
        reject(new Error(utilLib.errorAsJSON ("Invalid et/instance arg")));
    }
    OPTS.url = base_url + et + "/" + instance;
    rp(OPTS)
        .then(function (data) {
            resolve(data)
        })
    .catch(function (err) {
            reject(err);
        });
});
}

這是純凈的代碼:

module.exports.em7GetEntityInstance = function (et, instance) {

log.info("----- et before promise:(" + et + ")");
log.info("----- instance before promise:(" + instance + ")");

return new Promise(function(resolve, reject) {
    // var et = "device";
    // var instance = "33";

    // if null or undefined...
    if (!et || !instance) {
        log.error("---- et and/or instance args null.  rejecting");
        reject(new Error(utilLib.errorAsJSON ("getEntityInstace():Invalid entity type argument")));
    }
    var et = et.toLowerCase().trim();
    var url = baseurl + et + "/" + instance
    log.info("url:(" + url + ")");
    OPTS.url = url;
    rp(OPTS)
        .then(function (data) {
            log.debug ("success. invoking resolve()");
            resolve(data)
        })
    .catch(function (err) {
            log.error("+++ rp failed:(" + err  + ")");
            reject(err);
        });
});

}

和日志語句(它是一個服務器進程(沒有console.log)。使用winston日志模塊。

2016-05-05T15:44:06.866Z - info: ----- et before promise:(device)
2016-05-05T15:44:06.867Z - info: ----- instance before promise:(33)
2016-05-05T15:44:06.867Z - error: ---- et and/or instance args null.  rejecting

內部函數中的var et確實在外部作用域中用相同的名稱遮蓋了變量。 評估測試時尚undefined

避免使用var ,使用其他變量名稱,或者直接執行

var url = baseurl + et.toLowerCase().trim() + "/" + instance;

完全沒有中間變量。


但是您根本不應該使用內部函數 ,而應該使用

module.exports.em7GetEntityInstance = function(et, instance) {
    log.info("----- et before promise:(" + et + ")");
    log.info("----- instance before promise:(" + instance + ")");
    // if null or undefined...
    if (et==null || instance==null) {
        log.error("---- et and/or instance args null.  rejecting");
        return Promise.reject(new Error(utilLib.errorAsJSON ("getEntityInstace():Invalid entity type argument")));
    }
    var url = baseurl + et.toLowerCase().trim() + "/" + instance;
    log.info("url:(" + url + ")");
    OPTS.url = url;
    return rp(OPTS).then(function(data) {
        log.debug ("success. invoking resolve()");
        return data;
    }, function(err) {
        log.error("+++ rp failed:(" + err  + ")");
        throw err;
    });
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM