2017-08-16 115 views
-4

的getAsync功能等則已經被執行後,完成它的執行。一個人應該先完成然後再去另一個?怎麼回事?我怎樣才能解決這個問題?爲什麼我的承諾不工作?

function checkRedis() { 
 
\t \t return new Promise(resolve => { 
 
\t \t \t \t \t 
 
\t \t \t redis.set('kleberIsTheBest', 'heSureIs') 
 
\t \t \t \t .then(() => { 
 
\t \t \t \t \t console.log('1') 
 
\t \t \t \t \t redis.getAsync('bananas').then(data => { 
 

 
\t \t \t \t \t \t if(!data){ 
 
\t \t \t \t \t \t \t console.log('I got here bb') 
 
\t \t \t \t \t \t \t resolve('DOWN') 
 
\t \t \t \t \t \t } 
 

 
\t \t \t \t \t \t console.log(`here is the ${data}`) 
 
\t \t \t \t \t }) 
 
\t \t \t \t }) \t 
 
\t \t \t \t .then((x) => { 
 
\t \t \t \t \t console.log('2 ' + x) 
 
\t \t \t \t \t redis.del('kleberIsTheBest') 
 
\t \t \t \t \t console.log('i got here too bb') 
 
\t \t \t \t \t resolve('UP') 
 
\t \t \t \t }) 
 
\t \t \t \t .catch(() => { 
 
\t \t \t \t \t console.log('uh oh... something went bad!') 
 
\t \t \t \t \t resolve('DOWN') 
 
\t \t \t \t }) 
 
\t \t \t }) 
 
\t }

在一個側面說明,莫非是抓工作的?無法模擬錯誤落入捕獲處理程序。

+0

是應該如何等待的東西,它沒有一個參考?你爲什麼多次調用'resolve'? –

+0

我打電話多次解析,因爲它應該根據服務器狀態返回UP或DOWN。 –

+0

我不認爲你需要調用解決方案。我不認爲你需要新的承諾。 redis.set已經創建了一個承諾。 –

回答

-1

目前尚不清楚你正在使用的客戶端Redis的;但是,如果你正在使用node_redis(這是recommended client爲節點),然後set()不返回的承諾。該set()功能需要一個回調

如果您使用bluebird,則可以使用promisesnode_redis。 Promisifying node_redis使用藍鳥將增加功能與異步後綴;所以對於set()函數,將會有一個名爲setAsync()

這裏有兩種方法可以使用node_redis

隨着回調

var redis = require('redis'); 
var client = redis.createClient(); 

function checkRedis(callback) { 
    client.set('kleberIsTheBest', 'heSureIs', callback); 
}; 

checkRedis(function(error, result) { 
    if (error) { 
     console.error(error); 
    } else { 
     console.log('Done'); 
     console.log(result); 
    } 
}); 

隨着無極

var redis = require('redis'); 
var bluebird = require('bluebird'); 

bluebird.promisifyAll(redis.RedisClient.prototype); 
bluebird.promisifyAll(redis.Multi.prototype); 

var client = redis.createClient(); 

function checkRedis() { 
    return client.setAsync('kleberIsTheBest', 'heSureIs'); 
} 

checkRedis() 
.then(function(result) { 
    console.log('Done'); 
    console.log(result); 
}) 
.catch(function(error) { 
    console.error(error); 
}); 
+0

這不是OP的問題。他沒有得到某種「不能調用方法」,然後......「類型錯誤,他抱怨說它沒有按照預期的順序運行。 – Bergi

+0

@Bergi那很好,我知道;然而,我向OP展示了一個使用其中一個客戶端的例子,因爲他沒有說明他使用的是哪個Redis客戶端。那麼,我的回答是否被拒絕? – mscheker

+0

如果您想要了解有關使用的客戶端的說明,請使用註釋。如果你想給無關的東西提供建議,請使用註釋(可能帶有代碼鏈接)。是的,我做了downvote,因爲我認爲這個答案不能爲這個問題提供有用的解決方案。 (我不是說這是錯誤的或任何東西) – Bergi

0

好了,夥計們。我得到了答案。

大家很奇怪,都是我所要做的就是返回Redis的getAsync承諾,現在它的工作就像一個魅力!

function checkRedis() { 
 
\t \t return new Promise(resolve => { 
 
\t \t \t \t \t 
 
\t \t \t redis.set('kleberIsTheBest', 'heSureIs') 
 
\t \t \t \t .then(() => { 
 
\t \t \t \t \t return redis.getAsync('kleberIsTheBest') \t \t \t \t \t 
 
\t \t \t \t }) 
 
\t \t \t \t .then(data => { 
 

 
\t \t \t \t \t console.log(`here is the ${data}`) 
 

 
\t \t \t \t \t if(!data){ 
 
\t \t \t \t \t \t resolve('DOWN') 
 
\t \t \t \t \t } 
 

 
\t \t \t \t }) 
 
\t \t \t \t .then((x) => { 
 
\t \t \t \t \t redis.del('kleberIsTheBest') 
 
\t \t \t \t \t resolve('UP') 
 
\t \t \t \t }) 
 
\t \t \t \t .catch(() => { 
 
\t \t \t \t \t console.log('uh oh... something went bad!') 
 
\t \t \t \t \t resolve('DOWN') 
 
\t \t \t \t }) 
 
\t \t \t }) 
 
\t }