2016-09-01 136 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