2017-03-20 42 views
0

全部代碼時:https://github.com/kenpeter/clip_to_music操作都失靈,使用藍鳥

基本上,這個簡單的NodeJS腳本應該爲了

  1. 執行這些動作重命名所有mp4文件,所以沒有包含文件沒有空間。

  2. 轉換所有的MP4到MP3播放

  3. 殺死ADB服務器(與子進程可執行程序)

  4. 開始ADB服務器(與子進程可執行程序)

  5. 推到我的Android手機

部分示例代碼:

renamePromise 
    .then(() => { 
    return musicPromise; 
    }) 
    .then(() => { 
    return adbKillPromise; 
    }) 
    .then(() => { 
    return adbStartPromise; 
    }) 
    .then(() => { 
    return adbPushPromise; 
    }) 
    .then(() => { 
    console.log('---- all done----'); 
    process.exit(0); 
    }); 

輸出是這樣的,無序

; yarn start 
yarn start v0.21.3 
$ node clip_to_music.js 

---adb kill--- 
-- Rename one file -- 
/home/kenpeter/Videos/4K Video Downloader/1.mp4 
-- Rename one file -- 
/home/kenpeter/Videos/4K Video Downloader/2.mp4 
--- rename all files done --- 
adb push /var/www/html/test/testme/clip_to_music/audio/1.mp3 /sdcard/Music 
adb push /var/www/html/test/testme/clip_to_music/audio/2.mp3 /sdcard/Music 
---- done push all music --- 
* daemon not running. starting it now on port 5037 * 
* daemon started successfully * 

---adb start--- 
single mp3 done! 

single mp3 done! 

--------- all mp3 conversion done -------- 
---- all done---- 
Done in 10.79s. 

正如你可以看到上面的輸出,這是了訂單

  1. 它殺死ADB服務器(帶cild進程執行)
  2. 重命名所有的mp4文件,所以沒有文件不包含空格。
  3. 推動所有音樂,我的Android手機
  4. 開始ADB服務器(與子進程可執行程序)
  5. 轉換所有的MP4到MP3播放
+0

問題是什麼? – Besto

回答

0

你的代碼,意味着你已經開始通過musicPromise表示的操作,adbKillPromise,adbStartPromiseadbPushPromise,你同時在飛行中運行它們。因此,他們將按照他們自然結束的順序完成任務,並且您無法直接控制這一點。

記住承諾僅僅是一個監控異步操作的工具。既然你已經有了承諾,你必須已經開始了異步操作,因此你的承諾鏈並不能控制活動的順序。它確實控制着你處理結果的順序,而不是活動本身的順序。

要真正測序操作本身,你需要不啓動後續操作,直到您想在它之前完成更多像這樣的:

a().then(b).then(c).catch(err => { /* handler error here */}); 

a()b()c()是返回功能一個承諾和每個啓動他們相應的異步操作。

與您的操作的一個例子,改變這種:

// adb kill 
var adbKillPromise = new Promise((resolve, reject) => { 
    exec("adb kill-server", (err, stdout, stderr) => { 
    if (err) { 
     console.error(err); 
     return; 
    } 

    console.log(stdout); 
    console.log('---adb kill---'); 
    resolve(); 
    }); 
}); 

是以後可以調用一個函數:

// adb kill 
    function adbKill() { 
    return new Promise((resolve, reject) => { 
     exec("adb kill-server", (err, stdout, stderr) => { 
     if (err) { 
      console.error(err); 
      reject(err); 
      return; 
     } 

     console.log(stdout); 
     console.log('---adb kill---'); 
     resolve(); 
     }); 
    }); 
    } 

注意,它現在是一個返回函數一個承諾,所以它可以根據需求調用(只有當它是時間來調用它),我也添加了錯誤處理,所以它拒絕如果有錯誤。

而且,對於您定義的所有其他變量都要對應於您想要排序的異步操作之一。那麼,你可以這樣做:

rename().then(music).then(adbKill).then(adbStart).then(adbPush).then(() => { 
    console.log('---- all done----'); 
    process.exit(0); 
}).catch(err => { 
    console.log('Error', err); 
    process.exit(1); 
}); 
+0

Github代碼已更新。 var musicPromise =()=> {new Promise((resolve,reject)=> {......})},我做了這樣的事情,看起來行動是按順序的。但在musicPromise中,只有1個文件被轉換,並且從不打印「單個mp3完成!」我應該爲這個特定的代碼創建一個新的問題嗎? – kenpeter

+0

@kenpeter - 這是一個教科書的例子,爲什麼與您的問題相關的代碼應該被粘貼到實際問題中。任何人現在都來了,閱讀你的問題,並跟隨你的代碼鏈接將看到已經固定的代碼,而不是原來的代碼,並且不會理解你的問題,因爲你編輯了代碼引用已經顯示我建議的修復。所以,你已經破壞了你的問題的價值,作爲未來的參考,這是堆棧溢出的目標。 – jfriend00

+0

@kenpeter - 我認爲你的原始問題已經在這裏得到解答。 'musicPromise'裏面的一個新問題應該是一個新問題。並且,請將相關代碼粘貼到您要求避免上述問題的所有問題中。 – jfriend00