循環中處理某個變量,循環結束後使用這個變量。在同步中這不是事,可是在異步中,這個問題就變的特別的困難了。
首先我說說遇到的業務需求,我有一段html代碼,其中有不定數量的img標籤,要依次將img標籤對應的圖片上傳的微信服務器上,每上傳成功一張圖片,微信服務器返回一個url,將img標籤中的src值換成微信返回的url值,而後將上面的html代碼上傳
我直接說個人作法吧!
首先我用到了async cheerio包,你須要:npm install --save async cheerio
須要用到eachSeries(arr, iterator, [callback])方法
這個函數的做用就是將arr中的每個元素執行玩iterator以後,調用callback,--注意callback這裏只會調用一次,即arr中的元素都遍歷以後纔會調用callbackhtml
content = '<div>...</div>' //content是一段html const $ = cheerio.load(content); // $("img") 是一個Object let newArray = []; for(var img=0; img < $("img").length; img++){ newArray.push($("img")[img]); } async.eachSeries(newArray,function(curr,callback){ let src = curr.attribs.src; api.uploadImage("./public"+src, function(err,result){ if(err){ console.log("err",err) }else{ content = content.replace(src,result.url); // callback(null,content) callback(null) } }) },function(err){ console.log("content:",content) }) })