需要帮助使用Promise

时间:2016-09-01 09:12:27

标签: javascript node.js express promise loopbackjs

var leftpanefilter = {
    "organization": [],
    "speciality": [],
    "city": []
};

dataSource.connector.query(getCitySQL, function(err, citylist) {
    if (err) {
        console.log("Error getting citylist");
    } else {
        try {
            for (var i = 0; i < citylist.length; i++) {
                leftpanefilter.city.push(citylist[i].name);
            }
            // callback(null, leftpanefilter);
        } catch (err) {
            console.log(err);
        }
    }
});

// Get list of organization which has openings
dataSource.connector.query(getOrgSQL, function(err, organizationlist) {
    if (err) {
        console.log("Error getting organizationlist");
    } else {
        try {
            for (var i = 0; i < organizationlist.length; i++) {
                leftpanefilter.organization.push(organizationlist[i].name);
            }
        } catch (err) {
            console.log(err);
        }
    }
});

// Get list of specialities associated with openings
dataSource.connector.query(getCitySQL, function(err, specialitylist) {
    if (err) {
        console.log("Error getting specialitylist");
    } else {
        try {
            for (var i = 0; i < specialitylist.length; i++) {
                leftpanefilter.speciality.push(specialitylist[i].name);
            }
        } catch (err) {
            console.log(err);
        }
    }
});

callback(null, leftpanefilter);

由于Nodej的Async特性,回调返回空白数据而不等待查询执行。有谁知道如何使用promise来获取带有查询数据的输出?我无法弄清楚如何使节点等到所有查询完成后。

2 个答案:

答案 0 :(得分:0)

作为在这种情况下'可以'工作的一个例子:

var promise = new Promise(function(resolve, reject) {
    dataSource.connector.query(getCitySQL, function(err, callback) {
        if (err) {
            reject(err)
        }
        else {
            resolve(callback)
        }
    })
}).then(function(specialitylist) {
    for (var i = 0; i < specialitylist.length; i++) {
        leftpanefilter.speciality.push(specialitylist[i].name);
    }    
}).catch(function(err) {
    console.log('Something went wrong!')
    console.log(err)
});

我在这做什么?

我在查询数据库之前创建了一个新的promise,它有两个参数,一个解析(当db成功发送回调时)和拒绝(当出现错误时)。

然后.then()函数获取resolve的输出,并继续执行您希望对数据执行的任何操作。

.catch()函数用于处理编码时可能出现的任何错误或问题。

我想这可以帮助你现在的路上,如果你有任何其他问题,请告诉我

答案 1 :(得分:0)

就个人而言,我会在这种情况下使用Promise,如

var queryPromise = function(dataSource, sql, list) {
    return new Promise(function(resolve, reject) {
        dataSource.connector.query(sql, function(err, data) {
            if (err) {
                reject("Error getting " + list);
            }
            resolve(data);
        });
    });
};

Promise.all([
    queryPromise(dataSource, getCitySQL, 'citylist'),
    queryPromise(dataSource, getOrgSQL, 'organizationlist'),
    queryPromise(dataSource, getCitySQL, 'specialitylist')
]).then(function(results) {
    callback(null, {
        city: results[0],
        organization: results[1],
        speciality: results[2]
    });
}).catch(function(err) {
    console.log(err);
});

这没有错误检查,因为我不知道你会在你的示例案例中做什么

这也取代了您发布的所有代码 - 无需预定义leftpanefilter

注意:承诺全部,这些调用中的任何一个失败,整个事情都被“拒绝” - 并且永远不会调用回调 - 当然你可以自己改变它,但是因为你没有提供关于回调的信息是的,我只能推测这样不会这样做

  

注意:专业列表SQL与城市相同?你的拼写错误?

略有不同的方法

var queryPromise = function(dataSource, sql, list) {
    return new Promise(function(resolve, reject) {
        dataSource.connector.query(sql, function(err, data) {
            if (err) {
                resolve({error: "Error getting " + list});
            }
            resolve({data: data});
        });
    });
};

Promise.all([
    queryPromise(dataSource, getCitySQL, 'citylist'),
    queryPromise(dataSource, getOrgSQL, 'organizationlist'),
    queryPromise(dataSource, getCitySQL, 'specialitylist')
]).then(function(results) {
    callback(null, {
        city: results[0].data || results[0].error,
        organization: results[1].data || results[1].error,
        speciality: results[2].data || results[2].error
    });
});

在这种情况下没有“拒绝”因此,Promise.all将永远解决。发送到callback的数据中的值可以是数组,也可以是错误的字符串 - 因此,错误检查可以在回调中完成