JSFiddle - React, Tailwind, and code Playground

JavaScript

var doA = function(resolve, reject) {
    //Aくんの作業(1秒で終わる)
    console.log(new Date().toLocaleString() + " 板の買い物開始");
    setTimeout(function() {
        console.log(new Date().toLocaleString() + " 板の買い物完了");
        resolve();
    }, 1000);
};
var doB = function(resolve, reject) {
    //Bくんの作業(5秒で終わる)
    console.log(new Date().toLocaleString() + " 釘の買い物開始");
    setTimeout(function() {
        console.log(new Date().toLocaleString() + " 釘の買い物完了");
        resolve();
    }, 5000);
};
var doC = function(resolve, reject) {
    //Cくんの作業(3秒で終わる)
    console.log(new Date().toLocaleString() + " 板の切断開始");
    setTimeout(function() {
        console.log(new Date().toLocaleString() + " 板の切断完了");
        resolve();
    }, 3000);
};
var doD = function(resolve, reject) {
    //Dくんの作業(3秒で終わる)
    console.log(new Date().toLocaleString() + " 組み立て開始");
    setTimeout(function() {
        console.log(new Date().toLocaleString() + " 組み立て完了");
        resolve();
    }, 3000);
};

// Aくん、Bくんはすぐ買い物に行く
var promiseA = new Promise(doA);
var promiseB = new Promise(doB);
// Aくんの買い物後、Cくんが作業する
promiseA.then(function(){
    var promiseC = new Promise(doC);
    // BくんとCくんの作業が終わり次第Dくんが作業する
    Promise.all([promiseB, promiseC]).then(function() {
        var promiseD = new Promise(doD);
    });
});