2016-09-01 135 views
-1
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); 

由于Nodejs的异步性质,回调会返回空白数据,而不会等待查询执行。有谁知道如何使用承诺从查询中获取输出数据?我无法弄清楚如何让节点等待所有查询完成。使用Promise需要帮助

+0

承诺不是异步编码的灵丹妙药 –

+1

它可能不是,但它确实可以帮助OP在这种情况下(在真正快速查找后)。 – Roberrrt

回答

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) 
}); 

我在做什么吗?

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

.then()函数接着输出resolve,并继续执行您希望对数据执行的操作。

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

我想这能帮助你的方式,现在,让我知道如果您有任何其他疑问

0

就个人而言,我会用承诺在这种情况下,像

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的数据中的值将是一个数组,或者出现错误时的字符串 - 因此,可以在回调中进行错误检查

+0

这是非常好的,但有一个小捕获。如果我必须使用早期承诺中的数据来创建我的下一个承诺呢? (如果有一个非常简单的解决方案/我误解了代码,请随时纠正我)。 – Roberrrt

+0

不知道我理解你的问题,或者它与实际提出的问题有什么关系:p –

+0

我有点偏离是的,我过去几周一直在使用承诺系统(在同一个节点中)。 js)环境。你的解决方案看起来非常整齐,但我的子问题是:'我怎样才能使用我的第一个承诺的回调来构造一个我在第二个承诺中包装的查询?同时使用你的'Promise.all()'方法? – Roberrrt