Skip to content

Instantly share code, notes, and snippets.

@pjchender
Last active January 22, 2018 06:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pjchender/76193990b86911c4018eca93268ceace to your computer and use it in GitHub Desktop.
Save pjchender/76193990b86911c4018eca93268ceace to your computer and use it in GitHub Desktop.
AJAX, Promise, Async Example
keywords: aync, await
const fse = require('fs-extra')
const path = require('path')
const { exec } = require('child_process')

// NOTE: src 和 dist 都必需是資料夾,不能是檔案
let backupFiles = [
  {
    description: 'Notes written in markdown',
    src: '/Users/pjchender/Projects/Note/source/_posts',
    dist: path.join(__dirname, './MarkdownNotes')
  },
  {
    description: 'Notes SCSS template use in Codepen',
    src: '/Users/pjchender/Projects/Note/source/TEMPLATE',
    dist: path.join(__dirname, './Template')
  },
  {
    description: 'VSCode snippets, user settings',
    src: '/Users/pjchender/Library/Application Support/Code/User',
    dist: path.join(__dirname, './VSCode')
  },
  {
    description: 'Sublime Text',
    src: '/Users/pjchender/Library/Application Support/Sublime Text 3/Packages/User',
    dist: path.join(__dirname, './Sublime')
  }
]

/**
 * 先建立所有相關的資料夾
 */
function mkdirs (backupFiles) {
  return new Promise((resolve, reject) => {
    let distDirs = backupFiles.map(item => fse.ensureDir(item.dist))
    Promise.all(distDirs)
    .then(data => {
      resolve('mkdir successfully')
    })
    .catch(err => {
      console.error(err)
    })
  })
}

/**
 * 將檔案複製到資料夾中
 */
function cpdirs (backupFiles) {
  return new Promise((resolve, reject) => {
    let copyDirs = backupFiles.map(item => fse.copy(item.src, item.dist))
    Promise.all(copyDirs)
    .then(data => {
      resolve('copy directories successfully')
    })
    .catch(err => {
      console.error(err)
    })
  })
}

/**
 * 其他命令
 */
function execCMD () {
  return new Promise((resolve, reject) => {
    // use command line to list all installed extensions
    exec('code --list-extensions', (error, stdout, stderr) => {
      if (error) {
        console.error(`exec error: ${error}`)
        return
      }

      // save the result into file
      fse.writeFile(path.join(__dirname, './VSCode/installed-extension.txt'), stdout, err => {
        if (err) { return console.error(err) }
        resolve(`exec cmd successfully`)
      })
    })
  })
}

/**
 * 主要執行的程式
 */
async function main (backupFiles) {
  let mkdirsResult = await mkdirs(backupFiles)
  console.log('mkdirsResult', mkdirsResult)
  let cpdirsResult = await cpdirs(backupFiles)
  console.log('cpdirsResult', cpdirsResult)
  let execCMDResult = await execCMD()
  console.log('execCMDResult', execCMDResult)
  console.log('---All Files been Backup')
}

main(backupFiles)
/**
 * Basic Use of Promise
 **/

const basicPromise = new Promise((resolve, reject) => {
  setTimeout(function() {
    resolve('Get Data Succefful')
  }, 1000)
})

// when data "resolve/reject" will run callback below
basicPromise.then((value) => {
  console.log(value)
})

/**
 * Error Handling
 **/
const errorHandlingPromise = new Promise((resolve, reject) => {
  setTimeout(function() {
    reject('Get Data Failed')
  }, 1000)
})

errorHandlingPromise.then((value) => {
	console.log(value)
}, (error) => {
	console.log(error)
})
keywords: jQuery, AJAX

使用 .then() 來串連 AJAX 請求,適合用在需要先取得 Token 在發下一個請求的情況。

/**
 * Einvoice
 * app/javascript/components/einvoices-new.vue
 * Use .then to chain AJAX
 **/

let vm = this
const ENDPOINT = 'http://localhost:3000'
const CREDENTIAL = JSON.stringify({
  "auth": {
    "identifier": "54320091",
    "password": "12345678"
  }
})
let einvoice_token = ''
// Get einvoice token
$.ajax({
  type: "POST",
  beforeSend: function(xhr) {
    xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))
  },
  url: ENDPOINT + '/merchant_token',
  dataType: "json",
  contentType: 'application/json',
  crossDomain: true,
  data: CREDENTIAL
}).done(function(data) {
  einvoice_token = data.jwt
  console.log('get jwt token')
}).fail((jqXHR, textStatus, errorThrown) => {
  console.log('fail', textStatus, errorThrown)
}).then(function() {
  // Send data after getting einvoice token
  $.ajax({
    type: "POST",
    beforeSend: function(xhr) {
      xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))
    },
    url: ENDPOINT + '/v1/b2c/c0401',
    headers: {
      Authorization: `Bearer ${einvoice_token}`
    },
    dataType: "json",
    // processData: false,
    contentType: 'application/json',
    crossDomain: true,
    data: vm.dataToSend
  }).done(function(data) {
    console.log(data)
  }).fail((jqXHR, textStatus, errorThrown) => {
    console.log('fail', textStatus, errorThrown)
  })
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment