在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ 關(guān)于promise ajax 使用then順序執(zhí)行的問題

關(guān)于promise ajax 使用then順序執(zhí)行的問題

需要按順序執(zhí)行 ajax請求,之前請求到的數(shù)據(jù)需要傳給下一個函數(shù),一共需要走五步,使用resolve(xxx)來傳到下一個 promise里,但是到了第3步就開始報錯了,求大神指導(dǎo)

這個是在node環(huán)境下測試的

var superagent = require('superagent')
var p1 = function (path) {
    return new Promise(function (resolve, reject) {
        superagent.get(path).end(function (err, res) {

            if (err) {
                console.log('err1')

            } else {
                if (res.status == 200) {

                    console.log('step1')
                    resolve(path);
                }
            }
        })


    });
}
var p2 = function (path) {
    return new Promise(function (resolve, reject) {
        superagent.get(path).end(function (err, res) {

            if (err) {
                console.log('err2')

            } else {
                if (res.status == 200) {
                    console.log('step2')
                    resolve(path)
                }
            }
        })
    });
}
var p3 = function (path) {
    return new Promise(function (resolve, reject) {
        superagent.get(path).end(function (err, res) {
            
            if (err) {
                console.log('err3')

            } else {
                if (res.status == 200) {
                    console.log('step3')
                    resolve()
                }
            }
        })
    });
}
var p4 = function (path) {
    return new Promise(function (resolve, reject) {
        superagent.get(path).end(function (err, res) {
            
            if (err) {
                console.log('err4')

            } else {
                if (res.status == 200) {
                    console.log('step4')
                    resolve()
                }
            }
        })
    });
}


p1("http://www.baidu.com")
.then(function (val) {p2(val)})
.then(function (val) {p3(val)})
.then(function (val) {p4(val)})

打印結(jié)果:
step1
報錯
報錯
step2

發(fā)現(xiàn)第二步開始值就沒有傳到第三步里,并且也沒有按 step1---》step4這個順序執(zhí)行
求指導(dǎo)

回答
編輯回答
怣人

如下所示,少了return,不然沒法繼續(xù)then


var superagent = require('superagent')
var p1 = function (path) {
    return new Promise(function (resolve, reject) {
        superagent.get(path).end(function (err, res) {

            if (err) {
                console.log('err1')

            } else {
                if (res.status == 200) {

                    console.log('step1')
                    resolve(path);
                }
            }
        })


    });
}
var p2 = function (path) {
    return new Promise(function (resolve, reject) {
        superagent.get(path).end(function (err, res) {

            if (err) {
                console.log('err2')

            } else {
                if (res.status == 200) {
                    console.log('step2')
                    resolve(path)
                }
            }
        })
    });
}
var p3 = function (path) {
    return new Promise(function (resolve, reject) {
        superagent.get(path).end(function (err, res) {

            if (err) {
                console.log('err3')

            } else {
                if (res.status == 200) {
                    console.log('step3')
                    resolve(path)
                }
            }
        })
    });
}
var p4 = function (path) {
    return new Promise(function (resolve, reject) {
        superagent.get(path).end(function (err, res) {

            if (err) {
                console.log('err4')

            } else {
                if (res.status == 200) {
                    console.log('step4')
                    resolve(path)
                }
            }
        })
    });
}


p1("http://www.baidu.com")
    .then(function (val) { return p2(val)})
    .then(function (val) {return p3(val)})
    .then(function (val) {return p4(val)})
//輸出
step1
step2
step3
step4
2017年7月26日 15:23
編輯回答
祉小皓

問題上面說了

//還可以簡單的封裝
function inOrder(path, array) {
    return array.reduce((p, v) => p.then(v, e => {console.log('出錯了')}), Promise.resolve(path));
}

inOrder("http://www.baidu.com", [p1, p2, p3, p4])
    .then(v => {
        console.log('執(zhí)行完畢')
    })
2018年2月5日 15:51
編輯回答
鹿惑
p1("http://www.baidu.com")
  .then(function (val) {
    return p2(val)
  })
  .then(function (val) {
    return p3(val)
  })
  .then(function (val) {
    return p4(val)
  })
2017年3月31日 15:43