2017-02-28 49 views
-1

我嘗試使用回調答應refacter代碼,但我得到了來自無極(藍鳥)一些奇怪的行爲如果其他人在無極

這裏是主要的邏輯

function func1(callback) { 
    func2() 
    .then(function(resultFromFunc2) { 
    if (resultFromFunc2 === true) { 
     callback(null, resultFromFunc2) 
    } else { 
     return func3() 
    } 
    }) 
    .then(function(resultFromFunc3) { 
    console.log('Func 3', resultFromFunc3) 
    callback(null, resultFromFunc3) 
    }) 
    .catch(function(err) { 
    console.log('error', err) 
    }) 
} 

func1(function(err, result) { 
    console.log('func1', err, result); 
}) 

func2func3是隻是一個簡單的解決

function func2() { 
    return new Promise((resolve, reject) => { 
    resolve(true) 
    }); 
} 

function func3() { 
    return new Promise((resolve, reject) => { 
    resolve(true) 
    }); 
} 

如果func2決心true代碼應停止在第一個運行,那麼,但我發現第二個然後叫

這裏是從終端的結果。

func1 null true 
Func 3 undefined 
func1 null undefined 

我怎麼能停止調用第二那麼當func2是解決true

+0

@JaromandaX對不起,我不明白你的意思你的代碼依然採用了回調 –

+1

- 什麼是你正在試圖重構原始代碼? –

+0

你到底在做什麼?應該叫什麼? – paqash

回答

0

這裏的問題是你的第二個then部分。如果你刪除它,一切都應該按預期工作(如果我理解正確)。請參閱下面的代碼片段 - 如果您更改func2以解決(false),將調用func3,否則將調用回調。

function func1(callback) { 
 
    func2() 
 
    .then(function(resultFromFunc2) { 
 
    if (resultFromFunc2 === true) { 
 
     callback(null, resultFromFunc2) 
 
    } else { 
 
     return func3() 
 
    } 
 
    }) 
 
    .catch(function(err) { 
 
    console.log('error', err) 
 
    }) 
 
} 
 

 
func1(function(err, result) { 
 
    console.log('func1', err, result); 
 
}) 
 

 
function func2() { 
 
    return new Promise((resolve, reject) => { 
 
    console.log('func2'); 
 
    resolve(true) 
 
    }); 
 
} 
 

 
function func3() { 
 
    return new Promise((resolve, reject) => { 
 
    console.log('func3') 
 
resolve(true) 
 
    }); 
 
}

0

我只是找到了解決辦法,

function func1(callback) { 
    func2() 
    .then(function(resultFromFunc2) { 
    if (resultFromFunc2 === true) { 
     return 'result from func2' 
    } else { 
     return func3() 
    } 
    }) 
    .then(function(result) { 
    callback(null, result) 
    }) 
    .catch(function(err) { 
    console.log('error', err) 
    }) 
} 

我不應該在第一個,然後回調,因爲從第一回任何然後將其發送到第二呢。

我想念瞭解Promise的行爲。首先,我認爲它不會調用第二個,那麼如果第一個沒有返回Promise。

+0

'我嘗試使用回調Promise' refacter代碼 - 這是仍然使用回調 –

+0

@JaromandaX我不能refacter所有功能在同一時間,所以我需要首先從內部功能到refacter所以其他部分不應該影響。 –

0

@Phattahana, 只是發表我對你的問題的想法。

正如你在答案中所說的那樣,你不應該在第一天打電話給callback()。否則,您應該準備好更改工作流程並刪除2nd then。有很多可能性。

在一個特定的場景中,您希望執行的代碼就像您發佈的問題一樣(例如,如果if condition爲true,請不要調用2nd then - 場景),您可以使用下面的代碼。

var Promise = require("bluebird"); 
function func1(callback) { 
    func2() 
    .then((resultFromFunc2) => { 
     return new Promise((resolve, reject) => { 
      if (resultFromFunc2 === true) { 
      callback(null, resultFromFunc2); 
      } else { 
      resolve(func3()); 
      } 
     }); 
    }).then((resultFromFunc3) => { 
     console.log('Func 3', resultFromFunc3) 
     callback(null, resultFromFunc3) 
    }).catch((err) => { 
     console.log('error', err) 
    }); 
} 

func1((err, result) => { 
    console.log('func1', err, result); 
    return 1; 
}); 

function func2() { 
    return new Promise((resolve, reject) => { 
    resolve(false) 
    }); 
} 

function func3() { 
    return new Promise((resolve, reject) => { 
    resolve(true) 
    }); 
} 

1st then中的代碼應該做成一個單獨的承諾解析功能,應該解決它只有當條件不滿足。

希望它清楚。

感謝,